
#include "headers/ListaJugadores.h"
#include "headers/jugador.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

/*
 typedef struct NLista{
    Jugador* item;
    struct NLista* next;
    struct NLista* prev;
}NodoLista;


typedef struct ListaJugadores{
    NodoLista* first;
    NodoLista* last;
}ListaJugadores;
*/

NodoLista* ListaJugadores_getItemContainer(ListaJugadores* lista, int idJugador);   // implementado mas abajo

ListaJugadores* ListaJugadores_create(){
    ListaJugadores* list = malloc(sizeof(ListaJugadores));
    list->first = NULL;
    list->last = NULL;
    return list;
}

void ListaJugadores_add(ListaJugadores* lista, Jugador* jugador){
    NodoLista* oldLast;

    // creo el nuevo nodo
    NodoLista* newNode = malloc(sizeof(NodoLista*));
    newNode->next = NULL;
    newNode->item = jugador;

    if(ListaJugadores_isEmpty(lista)){
        lista->first = newNode;
        lista->last = newNode;
    }else{
        // pongo el nuevo al final
        oldLast = lista->last;
        oldLast->next = newNode;
        lista->last = newNode;
        newNode->prev = oldLast;
    }

}

int ListaJugadores_remove(ListaJugadores* lista, Jugador* jugador){
    NodoLista* prevNode;
    NodoLista* nextNode;
    Jugador* jugAux;
    NodoLista* nodo = ListaJugadores_getItemContainer(lista, Jugador_getId(jugador));

    if( nodo != NULL){
        prevNode = nodo->prev;
        nextNode = nodo->next;

        prevNode->next = nextNode;
        nextNode->prev = prevNode;

        // TODO: borrar el Jugador
        free(nodo);
        return 1;
    }else{
        return 0;
    }
}

Jugador* ListaJugadores_get(ListaJugadores* lista, int idJugador){
    NodoLista* nodo = ListaJugadores_getItemContainer(lista, idJugador);
    if(nodo != NULL){
        return nodo->item;
    }else{
        return NULL;
    }
}

void ListaJugadores_destroy(ListaJugadores* lista){
    NodoLista* nodo;
    NodoLista* next;

    while(!ListaJugadores_isEmpty(lista)){
        // TODO: liberar jugadores
        nodo = lista->first;
        next = nodo->next;
        free(nodo);
        lista->first = next;
    }
    free(lista);
}

int ListaJugadores_isEmpty(ListaJugadores* lista){
    return lista->first == NULL;
}

int ListaJugadores_size(ListaJugadores* lista){
    NodoLista* nodo;
    int count = 0;

    nodo = lista->first;
    while( nodo != NULL){
        count++;
        nodo = nodo->next;
    }
    return count;
}

NodoLista* ListaJugadores_getFirst(ListaJugadores* lista){
    return lista->first;
}

NodoLista* ListaJugadores_getNext(ListaJugadores* lista, NodoLista* nodo){
    return nodo->next;
}


NodoLista* ListaJugadores_getItemContainer(ListaJugadores* lista, int idJugador){
    NodoLista* nodo;
    Jugador* jugador;
    NodoLista* result = NULL;


    nodo = ListaJugadores_getFirst(lista);
    while(nodo != NULL){
        jugador = nodo->item;
        if(Jugador_getId(jugador)==idJugador){
            result = nodo;
        }
        nodo = nodo->next;
    }
    return result;
}
